package com.example.toy.core.table;

import com.example.toy.ToySystem;
import com.example.toy.core.locker.ToyLock;
import com.example.toy.core.reader.ToyTableReader;
import com.example.toy.core.version.ToyVersion;
import com.example.toy.core.writer.ToyTableWriter;
import java.io.Closeable;
import java.util.List;

public interface ToyTable extends Closeable {

  /**
   * 获取表的元数据
   *
   * @return
   */
  ToyTableMeta getTableMeta();

  /**
   * 获取表ID
   *
   * @return
   */
  TableIdentifier getTableIdentifier() ;

  /**
   * 获取ToySystem
   *
   * @return
   */
  ToySystem getToySystem();

  /**
   * 刷新 <br>
   * 如果当前表支持刷新，将表中所有属性刷新到最新版本的数据状态 TODO： 需要考虑是否将ToyTable设计为不可变对象
   */
  void refresh();

  /** 是否支持刷新 */
  boolean isRefreshable();

  /**
   * 跳转到某个版本，返回新版本的表对象
   *
   * @param version
   * @return
   */
  ToyTable switchTo(ToyVersion version);

  /**
   * 写表，只有最新版本支持写表，其他版本默认抛出异常
   *
   * @param force 如果当前表不是最新版本，但是force=true，则创建一个基于最新版本表的ToyTableWriter
   * @return
   */
  ToyTableWriter createWriter(boolean force);

  /**
   * 读取当前版本的表内容
   *
   * @return
   */
  ToyTableReader createReader();

  /**
   * 获取表锁
   *
   * @return
   */
  ToyLock getTableLock();

  /**
   * 获取分区锁
   *
   * @param partitionKey
   * @return
   */
  ToyLock getPartitionLock(String partitionKey);

  /**
   * 获取所有的分区键
   *
   * @return 分区键列表
   */
  List<String> getPartitionKeys();

  /**
   * 删除分区，注意这会删除该分区下的表数据并无法恢复
   *
   * @param partitionKey
   */
  void dropPartition(String partitionKey);

  /**
   * 对当前增量日志合并<br>
   * 合并后，不支持查询之前的版本数据，只会保留一个最新的版本数据
   *
   * @return 合并后的版本号
   */
  ToyVersion compact();

  /** 删除表，包括元数据和表数据 */
  void drop();

  /**
   * 是否是归档版本
   *
   * @return
   */
  boolean isArchived();
}
